
const jsQuestion = [
  {
    title: 'javaScript组成部分',
    answer:
      '1.ECMAScript：规定js语言的实现标准和规范；2.web Apis:DOM：文档对象模型;BOM：浏览器对象模型',
  },
  {
    title: '事件委托(事件代理)的作用',
    answer: '提高事件的绑定性能，避免对多个子元素绑定多个事件',
  },
 
  {
    title: '在正则表达式中，限定符 + * ? 的区别',
    answer: '+：匹配1个或多个; *：匹配0个或多个; ?：匹配0个或1个',
  },
  {
    title: '什么是防抖和节流',
    answer:
      '两者都是为了缓解函数频繁的调用，节流：有规律的执行，多用于鼠标事件；防抖：只执行最后一次，多用与键盘事件',
  },
  {
    title: '什么是深浅拷贝',
    answer:
      '浅拷贝：拷贝的是对象引用地址，新旧对象共享的是同一个引用地址，修改新的对象会影响久对象；深拷贝：拷贝的是对象本身，新旧对象不是共享同一个地址，即修改新对象不会改变旧对象',
  },
  {
    title: '什么是构造函数',
    answer:
      '就是把对象的一些相同的属性和方法抽离出来封装到函数中，再通过new此函数创建实例对象',
  },
  {
    title: '构造函数创建实例，new干了什么',
    answer:
      '1.执行了构造函数中的代码，2.在堆内存中创建一个对象，并用this指向他，3.构造函数隐式的返回this',
  },
  {
    title: '原型对象的特点',
    answer:
      '1.构造函数有一个属性prototype其值指向其原型对象，一般称为显示原型；2.实例对象有一个属性__proto__其值指向其原型对象，一般称之为隐式原型；3.原型对象有一个construct属性，指向构造函数本身',
  },
  {
    title: '原型对象的优点',
    answer:
      '抽离对象公有的属性和方法，解决内存空间浪费问题；用于对象的继承，实现代码的复用',
  },
  {
    title: 'JavaScript实现对象的继承常用的方式有哪些',
    answer: '伪造继承，原型继承，组合继承，寄生组合继承',
  },
  {
    title: '对Symbol的理解',
    answer:
      'Symbol是es6新引入的基本数据类型，表示独一无二的值，每个Symbol函数返回的值都是唯一的，他最典型的应用就是当做对象的key，防止命名冲突。特点：Symbol不能与其他数据进行运算，不能使用new，因为他不是一个构造器，Symbol创建的属性名不能被枚举出来',
  },
  {
    title: 'var let和const的区别',
    answer:
      'var声明的变量属于全局变量，可以变量提升，可以声明同一个变量但是后者会覆盖前者，let和const声明的变量属于块级作用域，不可变量提升，不能在相同作用域声明相同变量，let声明的变量后续是可以改变的 一般声明基本数据类型，const声明常量时就要赋值，且后续不能更改，一般用来声明引用类型',
  },
  {
    title: '如何解决深拷贝中对象自身引用和互相引用的问题',
    answer:
      '创建一个Map容器，作为缓存使用，每次递归时将对象存入进去，再次递归时判断缓存中是否已经含有该对象，有则返回，避免造成死递归',
  },
  {
    title: 'commonjs模块化和ESM模块化的区别',
    answer:
      'commonjs导出的是值的拷贝，而ESM导出的是值的引用，commonjs支持动态导入，而ESM不支持',
  },
  {
    title: '谈一谈js中变量提升',
    answer:
      '在执行JavaScript中的代码时，会先进行上下文域解析，把var声明的变量和function声明的函数提到作用域最上面，会给变量设置默认值undefined，如果声明的是同名的变量和函数，先获取到的是函数',
  },
  {
    title: '什么是作用域',
    answer:
      '用来描述变量或函数有限的访问范围，作用域可以分为两类：局部作用域：函数内部的区域；全局作用域：函数以外的作用域',
  },
  {
    title: '什么是作用域链',
    answer: '即各个函数作用域链互相嵌套形成的链式结构',
  },
  {
    title: '什么是原型链',
    answer: '各个实例对象和各个原型对象形成的一个链式结构',
  },
  {
    title: '什么是闭包',
    answer:
      '有权访问另一个函数的标识符的一个函数，形成的条件：子函数访问到祖先函数的标识符就能构成闭包',
  },
  {
    title: '什么是内存泄漏和内存溢出',
    answer:
      '内存泄漏：内存无法释放，由于疏忽或错误造成程序未能释放已经不在使用的内存;内存溢出：内存被撑爆',
  },
  {
    title: '什么情况下会造成内存泄漏',
    answer: '意外的全局变量，无效的DOM的引用，未关闭的时间器，',
  },
  {
    title: '什么是事件循环',
    answer:
      'js是单线程的，只有一个调用栈，同一时刻只能执行一件事情，在执行时遇到比较耗时的任务时，即异步任务，会放到浏览器相应的线程（webApis）中处理，然后将这些任务的回调函数放到任务队列中，等待执行，当调用栈执行完后，再从任务队列中拿取执行，重复以往，这就是事件循环，',
  },
  {
    title: 'Object.defineProperty()的作用',
    answer:
      '给对象添加属性或修改属性，对属性进行更精细化的控制。如是否可以枚举，删除，修改等;对属性进行get和set拦截',
  },
  {
    title: 'Object.defineProperty()的缺点',
    answer:
      '无法拦截对象的新增和删除属性操作，当对响应式对象新增属性，删除属性，页面不会更新，无法拦截数组，即直接通过下标修改数组或新增元素，界面也不会更新',
  },
];
export default jsQuestion;
